package org.example.interceptor;

import com.alibaba.fastjson.JSONObject;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;

import org.example.util.JwtUtils;
import org.example.vo.ResultVO;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

@Slf4j
@Component //Component注解用于将类声明为Spring Bean

public class LoginCheckInterceptor implements HandlerInterceptor {
    //拦截器，用于检查用户是否登录

    @Override  //在请求处理之前进行调用,返回true表示继续流程，返回false表示流程中断
    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
        //强制转型

        //1.获取请求的url
        String url = req.getRequestURI().toString();
        log.info("请求的url为：" + url);
        //2.判断url是否需要登录
        if (url.contains("login")) {
            log.info("登录，放行");
            return true;
        }
        //3.获取请求头中的token
        String token = req.getHeader("token");
        //4.判断token是否为空
        if (token == null) {
            log.info("token为空，返回为未登录");
            ResultVO error = ResultVO.error("NOT_LOGIN");
            //手动转换为json字符串
            String errorJson = JSONObject.toJSONString(error);
            resp.getWriter().write(errorJson);
            return false;
        }
        //5.解析token，判断token是否有效
        try {
            //解析token
            JwtUtils.parseJWT(token);
            log.info("token有效，放行");
        } catch (Exception e) {
            log.info("token无效，返回为未登录");
            ResultVO error = ResultVO.error("NOT_LOGIN");
            //手动转换为json字符串
            String errorJson = JSONObject.toJSONString(error);
            resp.getWriter().write(errorJson);
            return false;
        }
        //6.放行
        log.info("令牌合法，放行");
        return true;
    }

    @Override //在请求处理之后进行调用，但是在视图被渲染之前（Controller方法调用之后）
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override //在整个请求结束之后被调用，也就是在DispatcherServlet 渲染了对应的视图之后执行（主要是用于清理资源）
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}
